'use strict';

const BaseController = require("../base");
const SysUserDto = require("../../dto/sys-user.dto");
class SysUserController extends BaseController {
    /**
     * @description 分页查询列表
     * @param {SysUserDto.pageDto} 查询参数
     */
    async page() {
        try {
            //将得到的参数进行处理
            const verifytRes = this.verifytParams(SysUserDto.pageDto);
            if (!verifytRes.success) throw verifytRes.msg;

            //前往service层进行数据库的操作
            const res = await this.service.system.sysUser.page(verifytRes.params);
            if (!res.success) throw res.msg;

            //返回成功结果
            await this.listSuccess(res.data.rows, res.data.count);
        } catch (err) {
            await this.error(err);
        }
    }

    /**
    * @description 创建系统用户
    * @param {SysUserDto.createDto} 参数
    */
    async create() {
        try {
            const verifytRes = this.verifytParams(SysUserDto.createDto);
            if (!verifytRes.success) throw verifytRes.msg;

            //获取当前用户信息
            const user = await this.getLoginUser();
            console.log('获取当前登录用户', user)

            //添加创建人的id和创建时间
            let params = verifytRes.params;
            params.createById = user.id;
            params.createTime = new Date();

            //前往service层进行创建新用户
            const res = await this.service.system.sysUser.create(params);
            if (!res.success) throw res.msg;

            await this.success();
        } catch (err) {
            await this.error(err);
        }
    }

    /**
     * @description 编辑
     * @param {SysUserDto.editDto} 参数
     */
    async edit() {
        try {
            //对参数进行约束
            const verifytRes = this.verifytParams(SysUserDto.editDto);
            if (!verifytRes.success) throw verifytRes.msg;

            //获取当前用户信息
            const user = await this.getLoginUser();

            //获取id之后删除掉params下的要更新的用户id属性
            const id = verifytRes.params.id;
            delete verifytRes.params.id;

            //获取params的所有值,然后添加更新人id 更新人名字 更新人时间
            let params = verifytRes.params;
            params.updateById = user.id;
            params.updateByName = user.username;
            params.updateTime = new Date();

            //前往业务层进行处理,参数有要更新用户的id以及带过来的参数
            const res = await this.service.system.sysUser.edit(id, params);
            if (!res.success) throw res.msg;


            await this.success();
        } catch (err) {
            await this.error(err);
        }
    }

    /**
    * @description 删除
    * @param {SysUserDto.delDto} 参数
    */
    async del() {
        try {
            //通过dto.js约束参数,然后返回有约束的参数
            const verifytRes = this.verifytParams(SysUserDto.delDto);
            if (!verifytRes.success) throw verifytRes.msg;

            //前往业务层service进行删除用户,挟带要删除的人的id就行了,这里是软删除
            const res = await this.service.system.sysUser.del(verifytRes.params.id);
            if (!res.success) throw res.msg;

            await this.success();
        } catch (err) {
            await this.error(err);
        }
    }

    /**
     * @description 获取系统账号绑定的角色ID
     * @param {roleId} 角色ID
     */
    async getRoleIdByUser() {
        try {
            //通过dto.js约束参数,然后返回有约束的参数,比如这个它会返回在返回的参数中满足userId的必须值和所有参数的对象.
            const verifytRes = this.verifytParams({
                userId: {
                    required: true,
                    comment: "用户ID",
                }
            });
            if (!verifytRes.success) throw verifytRes.msg;

            //前往业务层进行处理,这时候就要用到用户角色表了
            const res = await this.service.system.sysUser.getRoleIdByUser(verifytRes.params.userId);
            if (!res.success) throw res.msg;

            await this.success(res.data);
        } catch (err) {
            await this.error(err);
        }
    }

    /**
     * @description 更新用户角色
     * @param {SysUserDto.updateRoleDto} 查询参数
     */
    async updateRole() {
        try {
            //通过dto.js约束参数,然后返回有约束的参数
            const verifytRes = this.verifytParams(SysUserDto.updateRoleDto);
            if (!verifytRes.success) throw verifytRes.msg;

            //处理数据将用户id和角色id对应起来
            let params = [];
            const userId = verifytRes.params.userId;
            verifytRes.params.roleIds.map(roleId => {
                params.push({ userId, roleId });
            })

            //前往service层进行业务处理,主要将带过去的params数组插入到用户角色表中,相当于更新了用户角色表的内容
            //用户角色表什么时候会更新?
            
            const res = await this.service.system.sysUser.updateRole(userId, params)

            if (!res.success) throw res.msg;
            await this.success();
        } catch (err) {
            await this.error(err);
        }
    }

    /**
     * @description 重置密码
     */
    async resetPwd() {
        try {
            //通过dto.js约束参数,然后返回有约束的参数
            const verifytRes = this.verifytParams({
                userId: {
                    required: true,
                    comment: "用户ID",
                },
                username: {
                    required: true,
                    comment: "登录账号",
                }
            });
            if (!verifytRes.success) throw verifytRes.msg;

            //将用户名作为一个重置密码进入数据库
            const newPwd = this.ctx.helper.md5(verifytRes.params.username);

            //前往service层进行处理
            const res = await this.service.system.sysUser.edit(verifytRes.params.userId, { password: newPwd });
            if (!res.success) throw res.msg;


            await this.success(res.data, '重置密码成功，新密码与登录账号一致');
        } catch (err) {
            await this.error(err);
        }
    }
}

module.exports = SysUserController;
